<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Set-Map</title>
</head>
<body>
<script type="text/javascript">
/** Set **/
// 类似数组,但不能有重复的数据
// 有迭代器,可以使用for...of...
// set没有下标,但有类似下标的keys() key是值本身
// 对象值:在外面创建好对象,把引用放入迭代器内,不然在迭代器里写对象,不会去重
// size 判断有没有这个值
// add() 添加一项数据 链式操作 set1.add().add()
// delete() 删除一项数据
// has() 判断有没有这个值
// clear() 清空所有数据

let set1 = new Set(['a','b'])
set1.add('c')
set1.delete('a')
console.log(set1) // b,c
console.log(set1.has('a')) // false
console.log(set1.size) // 2
for(let item of set1){ // 默认是values
    console.log(item) // b c
}
for(let item of set1.keys()){
    console.log(item) // b c
}
for(let item of set1.values()){
    console.log(item) // b c
}
for(let item of set1.entries()){ // key value是一样的
    console.log(item) // ["b", "b"] ["c", "c"]
}
for(let [k,v] of set1.entries()){
    console.log(k,v) // b b    c c
}
set1.forEach((v,i)=>{
    console.log(v,i) // b b    c c
})
// 数组去重
let arr1 = [1,1,2,2,3,3,4,4,5,5,6,6]
let arr2 = [...new Set(arr1)] // 先去重,但却是set数据类型,然后扩展运算符,扩展给一个空数组,在赋给arr2
console.log(arr2)

/** WeakSet **/
// 官方建议专门用来放置对象的 数据类型
// 有has add delete,没有size,clear
let weak1 = new WeakSet([{a:1}, [3, 4]])
console.log(weak1)

/** Map **/
// 类似对象,key value形式,但对象的key是字符串,Map可以是任意数据类型
// set(key,value) 设置一个值
// get(key) 获取一个值
// delete(key) 删除这个值
// has(key) 判断有没有这个值
// clear() 清空
// size 返回成员总数


let map1 = new Map()
map1.set('a', 1)
let b1= {'b':'2'}
map1.set(b1, 2)
map1.set('c',{'c':'3'})
console.log(map1)
console.log(map1.get(b1)) //map1.get({'b':'2'}) 这样是拿不到值的,因为对象是引用数据类型,看似值一样,其实堆空间不一样
for (let [key, value] of map1) {
  console.log(key, value); // 正常key就正常显示,引用类型就当引用类型显示
}
for (let [key, value] of map1.entries()) {
  console.log(key, value);
}
for (let key of map1.keys()) {
  console.log(key);
}
for (let value of map1.values()) {
  console.log(value);
}
for (let item of map1.entries()) {
  console.log(item[0], item[1]);
}
console.log('----forEach')
map1.forEach((index,item,arr)=>{
    console.log(index,item,arr)
})
// WeakMap
// key只能是对象,null除外
</script>
</body>
</html>